Cross-Origin Resource Sharing (CORS) boʻyicha toʻliq qoʻllanma: konfiguratsiya, xavfsizlik oqibatlari va dasturchilar uchun eng yaxshi amaliyotlar.
Cross-Origin Resource Sharing (CORS): Konfiguratsiya va Xavfsizlik bo‘yicha Eng Yaxshi Amaliyotlar
Veb-dasturlash dunyosida xavfsizlik eng muhim o'rinni egallaydi. Veb-xavfsizlikning muhim jihatlaridan biri bu bir manbadan olingan veb-sahifalarning boshqa manbadagi resurslarga qanday kirishini boshqarishdir. Aynan shu yerda Cross-Origin Resource Sharing (CORS) ishga tushadi. CORS — bu brauzer xavfsizlik xususiyati bo‘lib, u veb-sahifalarga veb-sahifani taqdim etgan domendan boshqa domenga so‘rovlar yuborishni cheklaydi. Ushbu mexanizm yomon niyatli veb-saytlarning maxfiy ma'lumotlarga kirishini oldini olish uchun mavjud. Ushbu maqolada CORS haqida to'liq qo'llanma taqdim etilgan bo'lib, uning konfiguratsiyasi, xavfsizlik oqibatlari va eng yaxshi amaliyotlari yoritilgan.
Bir xil Manba Siyosatini (Same-Origin Policy) Tushunish
CORS veb-brauzerlar tomonidan amalga oshiriladigan fundamental xavfsizlik mexanizmi bo‘lgan Bir xil Manba Siyosati (Same-Origin Policy) asosiga qurilgan. Bir xil manba siyosati veb-sahifalarga veb-sahifani taqdim etgan domendan boshqa domenga so‘rovlar yuborishni cheklaydi. Ikkita URL bir xil protokolga (masalan, HTTP yoki HTTPS), hostga (masalan, example.com) va portga (masalan, 80 yoki 443) ega bo‘lsa, ular bir xil manbaga ega deb hisoblanadi. Misol uchun:
http://example.comvahttp://example.com/pathbir xil manbadir.http://example.comvahttps://example.comturli manbalardir (protokollar har xil).http://example.comvahttp://www.example.comturli manbalardir (hostlar har xil).http://example.com:80vahttp://example.com:8080turli manbalardir (portlar har xil).
Bir xil manba siyosati Saytlararo Skripting (XSS) hujumlarining oldini olish uchun mo'ljallangan bo'lib, bunda yomon niyatli veb-sayt foydalanuvchi ma'lumotlarini o'g'irlash yoki ruxsatsiz harakatlarni amalga oshirish uchun ishonchli veb-saytga skriptlar kiritadi. Bir xil manba siyosati bo'lmaganida, agar siz boshqa tabda onlayn banking portaliga kirgan bo'lsangiz, yomon niyatli veb-sayt sizning bank hisobingiz ma'lumotlariga kirishi mumkin edi.
Cross-Origin Resource Sharing (CORS) nima?
Bir xil manba siyosati xavfsizlik uchun juda muhim bo'lsa-da, veb-saytlar turli manbalardan resurslarga kirishi kerak bo'lgan qonuniy holatlarda u cheklovchi bo'lishi mumkin. Masalan, example.com da joylashgan veb-ilova api.example.net da joylashgan API'dan ma'lumotlarni olishi kerak bo'lishi mumkin. CORS bir xil manba siyosatini nazorat ostida chetlab o'tish mexanizmini taqdim etadi, bu esa veb-sahifalarga server tomonidan aniq ruxsat berilganda manbalararo so'rovlar yuborish imkonini beradi.
CORS serverdan kelgan javobga HTTP sarlavhalarini qo'shish orqali ishlaydi va qaysi manbalarga resursga kirishga ruxsat berilganligini ko'rsatadi. Keyin brauzer bu sarlavhalarni tekshiradi va agar so'rov yuborayotgan veb-sahifaning manbasiga ruxsat berilmagan bo'lsa, so'rovni bloklaydi.
CORS qanday ishlaydi: HTTP Sarlavhalari
CORS manbalararo so'rovlarni osonlashtirish uchun maxsus HTTP sarlavhalariga tayanadi. Bu yerda asosiy sarlavhalar keltirilgan:
1. Origin (So‘rov sarlavhasi)
Origin sarlavhasi brauzer tomonidan manbalararo so'rovlarda yuboriladi. U so'rov yuborayotgan veb-sahifaning manbasini (protokol, host va port) ko'rsatadi. Misol uchun:
Origin: http://example.com
2. Access-Control-Allow-Origin (Javob sarlavhasi)
Access-Control-Allow-Origin sarlavhasi CORS'dagi eng muhim sarlavhadir. U qaysi manbalarga resursga kirishga ruxsat berilganligini belgilaydi. U quyidagi qiymatlardan biriga ega bo'lishi mumkin:
- Aniq bir manba: Masalan,
Access-Control-Allow-Origin: http://example.comfaqathttp://example.comdan kelgan so'rovlarga ruxsat beradi. *(wildcard):Access-Control-Allow-Origin: *har qanday manbadan kelgan so'rovlarga ruxsat beradi. Bundan ehtiyotkorlik bilan foydalanish kerak, chunki u ushbu resurs uchun bir xil manba siyosatini amalda o'chirib qo'yadi.
Misol:
Access-Control-Allow-Origin: https://www.example.com
3. Access-Control-Allow-Methods (Javob sarlavhasi)
Access-Control-Allow-Methods sarlavhasi manbalararo so'rovda ruxsat etilgan HTTP metodlarini (masalan, GET, POST, PUT, DELETE) belgilaydi. Bu preflight so'rovlari uchun talab qilinadi (quyida tushuntirilgan).
Misol:
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
4. Access-Control-Allow-Headers (Javob sarlavhasi)
Access-Control-Allow-Headers sarlavhasi manbalararo so'rovda ruxsat etilgan HTTP sarlavhalarini belgilaydi. Bu ham preflight so'rovlari uchun talab qilinadi.
Misol:
Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With
5. Access-Control-Allow-Credentials (Javob sarlavhasi)
Access-Control-Allow-Credentials sarlavhasi brauzerning manbalararo so'rovga hisob ma'lumotlarini (masalan, cookie'lar, avtorizatsiya sarlavhalari) kiritishi kerakligini belgilaydi. U ikkita qiymatdan biriga ega bo'lishi mumkin: true yoki false. Agar true o'rnatilgan bo'lsa, Access-Control-Allow-Origin sarlavhasini * ga o'rnatib bo'lmaydi. U aniq bir manba bo'lishi kerak.
Misol:
Access-Control-Allow-Credentials: true
6. Access-Control-Max-Age (Javob sarlavhasi)
Access-Control-Max-Age sarlavhasi brauzer preflight so'rovi natijalarini necha soniya keshlashi mumkinligini belgilaydi. Bu preflight so'rovlari sonini kamaytirish orqali ishlash samaradorligini oshirishi mumkin.
Misol:
Access-Control-Max-Age: 3600
Oddiy soʻrovlar va Preflight soʻrovlari
CORS ikki turdagi manbalararo so'rovlarni ajratadi: oddiy so'rovlar va preflight so'rovlari.
Oddiy soʻrovlar
Oddiy so'rov quyidagi mezonlarga javob beradigan so'rovdir:
- Metod
GET,HEADyokiPOST. - Agar metod
POSTbo'lsa,Content-Typesarlavhasi quyidagilardan biri bo'ladi:application/x-www-form-urlencoded,multipart/form-datayokitext/plain. - So'rov hech qanday maxsus sarlavhalarni (brauzer tomonidan avtomatik ravishda o'rnatiladiganlardan tashqari) o'rnatmaydi.
Oddiy so'rovlar uchun brauzer so'rovni to'g'ridan-to'g'ri serverga yuboradi. Keyin server tegishli CORS sarlavhalari bilan javob beradi. Agar manbaga ruxsat berilgan bo'lsa, brauzer javobni qayta ishlaydi. Aks holda, brauzer javobni bloklaydi va xatolik chiqaradi.
Preflight soʻrovlari
Preflight so'rovi, agar so'rov oddiy so'rov mezonlariga javob bermasa, brauzer tomonidan haqiqiy manbalararo so'rovni yuborishdan oldin yuboriladi. Bu odatda so'rov GET, HEAD yoki POST dan boshqa metoddan foydalanganda yoki so'rov maxsus sarlavhalarni o'rnatganda sodir bo'ladi.
Preflight so'rovi quyidagi sarlavhalarni o'z ichiga olgan OPTIONS so'rovidir:
Origin: So'rov yuborayotgan veb-sahifaning manbasi.Access-Control-Request-Method: Haqiqiy so'rovda ishlatiladigan HTTP metodi.Access-Control-Request-Headers: Haqiqiy so'rovda ishlatiladigan maxsus sarlavhalarning vergul bilan ajratilgan ro'yxati.
Keyin server quyidagi sarlavhalar bilan javob beradi:
Access-Control-Allow-Origin: Resursga kirishga ruxsat berilgan manba.Access-Control-Allow-Methods: Manbalararo so'rovda ruxsat etilgan HTTP metodlari.Access-Control-Allow-Headers: Manbalararo so'rovda ruxsat etilgan HTTP sarlavhalari.Access-Control-Max-Age: Brauzer preflight so'rovi natijalarini necha soniya keshlashi mumkinligi.
Agar server tegishli CORS sarlavhalari bilan javob bersa, brauzer haqiqiy manbalararo so'rovni davom ettiradi. Aks holda, brauzer so'rovni bloklaydi va xatolik chiqaradi.
CORS Konfiguratsiyasi Misollari
CORS'ni amalga oshirish siz foydalanayotgan server tomonidagi texnologiyaga qarab farq qiladi. Bu yerda umumiy server tomonidagi tillar va freymvorklar uchun ba'zi misollar keltirilgan:
Node.js va Express
cors middleware'idan foydalanish Node.js va Express'da CORS'ni sozlashning keng tarqalgan usulidir:
const express = require('express');
const cors = require('cors');
const app = express();
// Barcha manbalar uchun CORS'ni yoqish
app.use(cors());
// Muayyan manba uchun CORS'ni yoqish
// app.use(cors({ origin: 'http://example.com' }));
// Opsiyalar bilan CORS'ni yoqish
// app.use(cors({
// origin: ['http://example.com', 'http://localhost:3000'],
// methods: ['GET', 'POST', 'PUT', 'DELETE'],
// allowedHeaders: ['Content-Type', 'Authorization'],
// credentials: true
// }));
app.get('/api/data', (req, res) => {
res.json({ message: 'API\'dan salom!' });
});
app.listen(3001, () => {
console.log('Server 3001-portda ishlamoqda');
});
Python va Flask
Flask'da CORS'ni sozlash uchun Flask-CORS kengaytmasidan foydalanishingiz mumkin:
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
# Barcha manbalar uchun CORS'ni yoqish
CORS(app)
# Muayyan manbalar uchun CORS'ni yoqish
# CORS(app, origins=['http://example.com', 'http://localhost:3000'])
@app.route('/api/data')
def get_data():
return {'message': 'API\'dan salom!'}
if __name__ == '__main__':
app.run(port=3001)
Java va Spring Boot
Spring Boot CORS'ni sozlashning bir necha usulini taqdim etadi. Bir usul - @CrossOrigin annotatsiyasidan foydalanish:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin(origins = "http://example.com") // Muayyan manba
public class ApiController {
@GetMapping("/api/data")
public String getData() {
return "API'dan salom!";
}
}
// Global CORS konfiguratsiyasi (WebMvcConfigurer yordamida):
// @Configuration
// public class CorsConfig implements WebMvcConfigurer {
// @Override
// public void addCorsMappings(CorsRegistry registry) {
// registry.addMapping("/**")
// .allowedOrigins("http://example.com", "http://localhost:3000")
// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
// .allowedHeaders("Content-Type", "Authorization")
// .allowCredentials(true)
// .maxAge(3600);
// }
// }
PHP
PHP'da siz CORS sarlavhalarini to'g'ridan-to'g'ri skriptingizda o'rnatishingiz mumkin:
<?php
header("Access-Control-Allow-Origin: http://example.com");
header("Content-Type: application/json");
$data = array("message" => "API'dan salom!");
echo json_encode($data);
?>
CORS Xavfsizlik Mulohazalari
CORS manbalararo so'rovlarga imkon bergan bo'lsa-da, zaifliklardan qochish uchun xavfsizlik oqibatlarini tushunish va uni to'g'ri amalga oshirish juda muhimdir.
1. Ishlab chiqarishda Access-Control-Allow-Origin: * dan foydalanishdan saqlaning
Access-Control-Allow-Origin sarlavhasida * yulduzchasidan foydalanish har qanday manbadan so'rovlarga ruxsat beradi, bu esa ushbu resurs uchun bir xil manba siyosatini amalda o'chirib qo'yadi. Bu sizning API'ngizni yomon niyatli veb-saytlarga ochib qo'yishi mumkin, ular foydalanuvchi ma'lumotlarini o'g'irlashi yoki ruxsatsiz harakatlarni amalga oshirishi mumkin. Buning o'rniga, resursga kirishga ruxsat berilgan aniq manbalarni belgilang. Masalan, agar veb-ilovangiz example.com da joylashgan bo'lsa va api.example.com da joylashgan API'ga kirishi kerak bo'lsa, sarlavhani Access-Control-Allow-Origin: http://example.com qilib o'rnating.
Global misol: Moliyaviy xizmat API'si Access-Control-Allow-Origin: * ni o'rnatganini tasavvur qiling. Keyin yomon niyatli veb-sayt tizimga kirgan foydalanuvchi nomidan ushbu API'ga so'rovlar yuborishi va foydalanuvchining xabarisiz mablag'larni o'tkazishi mumkin.
2. Serverda Origin Sarlavhasini Tekshiring
Ruxsat etilgan manbalar ro'yxatini belgilagan bo'lsangiz ham, tajovuzkorlarning manbani soxtalashtirishining oldini olish uchun serverdagi Origin sarlavhasini tekshirish muhimdir. Tajovuzkor CORS tekshiruvlarini chetlab o'tish uchun soxta Origin sarlavhasi bilan so'rov yuborishi mumkin. Buni yumshatish uchun Origin sarlavhasini server tomonidagi ishonchli manbalar ro'yxati bilan solishtiring. Agar manba ro'yxatda bo'lmasa, so'rovni rad eting.
Global misol: Elektron tijorat platformasini ko'rib chiqing. Tajovuzkor elektron tijorat platformasining API'sidan maxfiy mijoz ma'lumotlariga kirish uchun qonuniy do'konning Origin'ini taqlid qilishga harakat qilishi mumkin.
3. Access-Control-Allow-Credentials: true bilan ehtiyot bo'ling
Agar siz Access-Control-Allow-Credentials: true ni o'rnatsangiz, Access-Control-Allow-Origin sarlavhasi * ga o'rnatilishi mumkin emas. U aniq bir manba bo'lishi kerak. Buning sababi, har qanday manbadan hisob ma'lumotlariga ruxsat berish xavfsizlik xavfini tug'dirishi mumkin, chunki agar ular foydalanuvchini o'z saytiga kirishga aldashsa va foydalanuvchi bir vaqtning o'zida maqsadli veb-saytga kirgan bo'lsa, yomon niyatli veb-saytlarga foydalanuvchi ma'lumotlariga kirishga imkon berishi mumkin. Bu sozlama cookie'lar yoki avtorizatsiya sarlavhalari bilan ishlaganda muhimdir.
Global misol: Hisob ma'lumotlari bilan manbalararo so'rovlarga ruxsat beruvchi ijtimoiy media platformasi foydalanuvchi hisoblariga ruxsatsiz kirishni oldini olish uchun ehtiyotkorlik bilan boshqaruvni talab qiladi.
4. Access-Control-Allow-Methods va Access-Control-Allow-Headers ni to'g'ri sozlang
Faqat manbalararo so'rovlar uchun zarur bo'lgan HTTP metodlari va sarlavhalariga ruxsat bering. Agar siz faqat GET va POST so'rovlariga ruxsat berishingiz kerak bo'lsa, PUT, DELETE yoki boshqa metodlarga ruxsat bermang. Xuddi shunday, faqat ilovangizga kerak bo'lgan maxsus sarlavhalarga ruxsat bering. Haddan tashqari ruxsat beruvchi konfiguratsiyalar hujum xavfini oshirishi mumkin.
Global misol: CRM tizimi faqat kerakli API nuqtalari va sarlavhalarini vakolatli uchinchi tomon integratsiyalariga ochib, hujum yuzasini minimallashtirishi kerak.
5. Xavfsiz aloqa uchun HTTPS dan foydalaning
Brauzer va server o'rtasidagi xavfsiz aloqa uchun har doim HTTPS dan foydalaning. HTTPS brauzer va server o'rtasida uzatiladigan ma'lumotlarni shifrlaydi, bu esa tinglash va "o'rtadagi odam" hujumlarining oldini oladi. HTTP dan foydalanish, hatto CORS to'g'ri sozlangan bo'lsa ham, maxfiy ma'lumotlarni tajovuzkorlarga ochib qo'yishi mumkin.
Global misol: Sog'liqni saqlash ilovalari turli manbalar bo'ylab uzatiladigan bemor ma'lumotlarini himoya qilish uchun HTTPS dan foydalanishi shart.
6. Kontent Xavfsizlik Siyosati (CSP)
CORS bilan bevosita bog'liq bo'lmasa-da, Kontent Xavfsizlik Siyosati (CSP) XSS hujumlarining oldini olishga yordam beradigan yana bir muhim xavfsizlik mexanizmidir. CSP brauzerga resurslarni yuklashga ruxsat berilgan manbalarning oq ro'yxatini belgilash imkonini beradi. Bu, agar ular boshqa xavfsizlik choralarini chetlab o'tishga muvaffaq bo'lishsa ham, tajovuzkorlarning veb-saytingizga yomon niyatli skriptlarni kiritishining oldini olishga yordam beradi.
Global misol: Moliyaviy institutlar XSS hujumlari xavfini kamaytirish uchun o'zlarining onlayn banking portallariga yuklangan kontent manbalarini cheklash uchun qattiq CSP siyosatlaridan foydalanadilar.
Umumiy CORS Muammolari va Ularni Bartaraf Etish
CORS xatolarini tuzatish asabiylashtirishi mumkin. Bu yerda ba'zi umumiy muammolar va ularni qanday bartaraf etish yo'llari keltirilgan:
1. "No 'Access-Control-Allow-Origin' header is present on the requested resource."
Bu eng keng tarqalgan CORS xatosi. Bu server o'z javobida Access-Control-Allow-Origin sarlavhasini qaytarmayotganini bildiradi. Serverning so'rov yuborayotgan veb-sahifaning manbasi uchun to'g'ri CORS sarlavhalarini yuborishga sozlanganligiga ishonch hosil qiling. Server tomonidagi kodingizni va konfiguratsiya fayllarini ikki marta tekshiring.
2. "Response to preflight request doesn't pass access control check: It does not have HTTP ok status."
Bu xato preflight so'rovi muvaffaqiyatsiz bo'lganini bildiradi. Bu, agar server OPTIONS so'rovlariga javob bermasa yoki preflight so'roviga javoban xato status kodini (masalan, 404, 500) qaytarsa sodir bo'lishi mumkin. Serveringiz OPTIONS so'rovlarini qayta ishlashga sozlanganligiga va 200 OK status kodini qaytarayotganiga ishonch hosil qiling.
3. "Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'."
Bu xato siz manbalararo so'rovda hisob ma'lumotlarini (masalan, cookie'lar) yuborishga harakat qilganingizda va Access-Control-Allow-Origin sarlavhasi * ga o'rnatilganida sodir bo'ladi. Yuqorida aytib o'tilganidek, hisob ma'lumotlarini yuborishda * yulduzchasidan foydalana olmaysiz. Siz resursga kirishga ruxsat berilgan aniq manbani belgilashingiz kerak.
4. Brauzer Keshlashi
Brauzerlar CORS javoblarini keshlashi mumkin, bu esa CORS konfiguratsiyasi o'zgarganda kutilmagan xatti-harakatlarga olib kelishi mumkin. Keshlash muammolarining oldini olish uchun javobdagi Cache-Control sarlavhasini no-cache, no-store yoki max-age=0 ga o'rnating. Shuningdek, brauzer preflight so'rovi natijalarini qancha vaqt keshlashini nazorat qilish uchun Access-Control-Max-Age sarlavhasidan foydalanishingiz mumkin.
CORS'ga Alternativalar
CORS manbalararo so'rovlarni yoqishning standart usuli bo'lsa-da, ba'zi holatlarda ko'rib chiqishingiz mumkin bo'lgan ba'zi alternativlar mavjud:
1. JSON with Padding (JSONP)
JSONP - bu bir xil manba siyosatini chetlab o'tish uchun <script> tegidan foydalanadigan texnika. JSONP JSON ma'lumotlarini JavaScript funksiya chaqiruviga o'rash orqali ishlaydi. Keyin brauzer JavaScript funksiyasini bajaradi va JSON ma'lumotlarini argument sifatida o'tkazadi. JSONP'ni amalga oshirish CORS'ga qaraganda osonroq, lekin uning ba'zi cheklovlari bor. U faqat GET so'rovlarini qo'llab-quvvatlaydi va CORS'ga qaraganda kamroq xavfsizdir.
2. Teskari Proksi (Reverse Proxy)
Teskari proksi - bu sizning API serveringiz oldida turadigan va unga so'rovlarni yo'naltiradigan server. Teskari proksini javobga kerakli CORS sarlavhalarini qo'shish uchun sozlash mumkin, bu esa manbalararo so'rovlarni brauzerdan samarali yashiradi. Bu yondashuv, agar siz API serverini nazorat qila olmasangiz yoki CORS konfiguratsiyasini soddalashtirmoqchi bo'lsangiz foydali bo'lishi mumkin.
Xulosa
Cross-Origin Resource Sharing (CORS) - bu veb-sahifalarga turli manbalardan resurslarga nazorat ostida kirish imkonini beruvchi muhim xavfsizlik mexanizmidir. CORS qanday ishlashini tushunish va uni to'g'ri amalga oshirish xavfsiz va ishonchli veb-ilovalarni yaratish uchun zarurdir. Ushbu maqolada bayon etilgan eng yaxshi amaliyotlarga rioya qilish orqali siz CORS'ni samarali boshqarishingiz va API'laringizni ruxsatsiz kirishdan himoya qilishingiz mumkin.
CORS'ni sozlashda har doim xavfsizlikka ustuvor ahamiyat bering. Yulduzchalardan foydalanishdan saqlaning, Origin sarlavhasini tekshiring va xavfsiz aloqa uchun HTTPS dan foydalaning. Ushbu ehtiyot choralarini ko'rish orqali siz veb-ilovalaringiz saytlararo hujumlardan himoyalanganligini ta'minlashingiz mumkin.
Ushbu keng qamrovli qo'llanma CORS'ni tushunish uchun mustahkam poydevor yaratadi. Eng so'nggi ma'lumotlar va eng yaxshi amaliyotlar uchun har doim o'zingizning maxsus server tomonidagi texnologiyangizning rasmiy hujjatlariga murojaat qiling. Yangi paydo bo'layotgan xavfsizlik tahdidlaridan xabardor bo'ling va CORS konfiguratsiyangizni shunga mos ravishda moslashtiring.